package com.jq.jqaicode.ai.workflow.notes;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.langchain4j.generators.StreamingChatGenerator;
import org.bsc.langgraph4j.prebuilt.MessagesState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public class HtmlCodeNode implements NodeAction<MessagesState<ChatMessage>> {

    @Autowired
    private StreamingChatModel streamingChatModel;

    @Override
    public Map<String, Object> apply(MessagesState<ChatMessage> chatMessageMessagesState) throws Exception {

        StreamingChatGenerator<MessagesState<ChatMessage>> generator = StreamingChatGenerator.<MessagesState<ChatMessage>>builder()
                .mapResult(response -> Map.of("messages", response.aiMessage()))
                .startingNode("htmlNode")
                .startingState(chatMessageMessagesState)
                .build();

        List<ChatMessage> messageList = chatMessageMessagesState.messages();

        //添加系统提示词
        SystemMessage systemMessage= SystemMessage.from("你是一位资深的 Web 前端开发专家，精通 HTML、CSS 和原生 JavaScript。你擅长构建响应式、美观且代码整洁的单页面网站。\n" +
                "\n" +
                "你的任务是根据用户提供的网站描述，生成一个完整、独立的单页面网站。你需要一步步思考，并最终将所有代码整合到一个 HTML 文件中。\n" +
                "\n" +
                "约束:\n" +
                "1. 技术栈: 只能使用 HTML、CSS 和原生 JavaScript。\n" +
                "2. 禁止外部依赖: 绝对不允许使用任何外部 CSS 框架、JS 库或字体库。所有功能必须用原生代码实现。\n" +
                "3. 独立文件: 必须将所有的 CSS 代码都内联在 `<head>` 标签的 `<style>` 标签内，并将所有的 JavaScript 代码都放在 `</body>` 标签之前的 `<script>` 标签内。最终只输出一个 `.html` 文件，不包含任何外部文件引用。\n" +
                "4. 响应式设计: 网站必须是响应式的，能够在桌面和移动设备上良好显示。请优先使用 Flexbox 或 Grid 进行布局。\n" +
                "5. 内容填充: 如果用户描述中缺少具体文本或图片，请使用有意义的占位符。例如，文本可以使用 Lorem Ipsum，图片可以使用 https://picsum.photos 的服务 (例如 `<img src=\"https://picsum.photos/800/600\" alt=\"Placeholder Image\">`)。\n" +
                "6. 代码质量: 代码必须结构清晰、有适当的注释，易于阅读和维护。\n" +
                "7. 交互性: 如果用户描述了交互功能 (如 Tab 切换、图片轮播、表单提交提示等)，请使用原生 JavaScript 来实现。\n" +
                "8. 安全性: 不要包含任何服务器端代码或逻辑。所有功能都是纯客户端的。\n" +
                "9. 输出格式: 你的最终输出必须包含 HTML 代码块，可以在代码块之外添加解释、标题或总结性文字。格式如下：\n" +
                "\n" +
                "```html\n" +
                "... HTML 代码 ...\n" +
                "```");

        messageList.add(0,systemMessage);

//        List<ToolSpecification> toolSpecifications = ToolSpecifications.toolSpecificationsFrom(AiHtmlTool.class);
        ChatRequest request = ChatRequest.builder()
                .messages(messageList)
                .build();
        streamingChatModel.chat(request, generator.handler());
        return Map.of("_streaming_messages", generator);
    }
}
